package com.davidlife.javase.annotation;

import java.lang.reflect.Method;

/*
小模拟框架类；
通过配置，可以不改变代码，创建任意类的对象，并执行任意方法
这里通过自定义注解和反射来实现
 */
@ConfigurAnno(className = "com.davidlife.javase.annotation.PersonBean", methodName = "sayHello")
public class UseAnnoTest {
    public static void main(String[] args) throws Exception {
        /*解析注解*/
        //1 先获取该类的字节码文件对象
        Class<UseAnnoTest> useAnnoTestClass = UseAnnoTest.class;
        //2 获取上面标注的注解的对象
        //这句语句其实就是在内存中生成了一个该注解接口的子类实现对象，这个子类对象就象下面这样：
        /*
            public class ConfigurAnnoImpl implements ConfigurAnno {
                public String className() {
                    return "com.davidlife.javase.annotation.PersonBean"
                }
                public String methodName() {
                    return "sayHello"
                }
            }
        */
        ConfigurAnno annotation = useAnnoTestClass.getAnnotation(ConfigurAnno.class);
        //3. 调用注解对象中定义的抽象方法，获取注解的属性值
        String className = annotation.className();
        String methodName = annotation.methodName();

        /*通过放射执行配置的类名及方法名*/
        //1. 加载该类进内存
        Class<PersonBean> cls = (Class<PersonBean>) Class.forName(className);
        //2. 创建对象
        PersonBean personBean = cls.newInstance();
        //3. 获取方法对象
        Method method = cls.getMethod(methodName);
        //4. 执行方法
        method.invoke(personBean);
    }
}
